<?php
include_once __DIR__ . '/../Base.php';
include_once __DIR__ . '/../system.MsgRouter.php';

class C群聊天 extends Base{
    public $vo信息中心;
    public $vi公众号ID;
    public $vi公众号openID;
    public $vo用户数据;

    /**
     * @param C信息中心 $vo中心
     */
    public function __construct($vo中心){

        parent::__construct();

        if ($vo中心 instanceof C信息中心) {
            $this->vo信息中心=$vo中心;
            $this->vsOpenId=$vo中心->vs用户OpenId;
            $this->vi公众号openID=$vo中心->vs公众号OpenId;
            $this->vi公众号ID=$vo中心->vs公众号Id;
            $this->vo用户数据=$vo中心->vc用户->vo用户数据 ;
        }

    }
    public function fc查看用户信息by_ID($用户id){
        return pdo()->selectColumns('用户',array('*'),array('id'=>$用户id));
    }
    public function fc查看用户信息by_成员ID($成员id){
        $群成员信息 = pdo()->selects("SELECT b.name,b.openID,b.`公众号ID`,c.`群名称`,a.`角色`,a.`群id` ,a.`用户id`
FROM `群成员` a  LEFT JOIN `用户` b ON(a.`用户id`=b.id) LEFT JOIN `群详情` c on(a.`群id`=c.id) WHERE a.id=?;",array($成员id));
        return $群成员信息['0'];
    }

    public function fc查看用户信息by_用户id群id($用户id,$群id){
        $用户群信息 = pdo()->selects("SELECT b.name,b.openID,b.`公众号ID`,c.`群名称`,a.`角色`,a.`群id` ,a.`用户id`  FROM `群成员` a  LEFT JOIN `用户` b ON(a.`用户id`=b.id) LEFT JOIN `群详情` c on(a.`群id`=c.id) WHERE a.`群id`=? AND a.`用户id`=?",array($群id,$用户id));
        return $用户群信息['0'];
    }

    public  function fx显示群二维码($群id,$用户id){

        $do用户= new Do用户();
        $do用户->loadByKeys(array('id'=>$用户id));

        $用户群信息 =$this->fc查看用户信息by_用户id群id($do用户->get_id(),$群id);

        $二维码已经存在 = $this->fc查看该用户的群邀请二维码是否存在($群id);
        if($二维码已经存在) return $二维码已经存在;

        return $this->fs生成群二维码($do用户,$用户群信息);
    }

    private function fs生成群二维码(Do用户 $do用户,$用户群信息){

        if($用户群信息['角色']=='群主')   return C二维码::fz增加二维码($do用户,$用户群信息['群id'],5,1,$do用户->get_公众号ID(),$do用户->get_公众号openID());

        return $是否生成二维码=C二维码::fz增加二维码($do用户,$用户群信息['群id'],5,false,$do用户->get_公众号ID(),$do用户->get_公众号openID(),'','604800');

    }

    public function fc查看该用户的群邀请二维码是否存在($群id){


        $二维码存在 = pdo()->selects("SELECT a.`code`,a.create_time FROM `qrcode` a WHERE a.user_id =? AND a.business ='5' AND a.note=? ORDER BY id DESC  LIMIT 0,1;",array($_SESSION['vo用户数据']['id'],$群id));
        if(!$二维码存在) return false;
        //判断当前临时二维码生成是否超过6天
        if(date("Y-m-d H:i:s",(strtotime($二维码存在[0]['create_time']) + 518400)) <date("Y-m-d H:i:s")) return false;


        return $二维码存在[0]['code'];

    }

    public function ft添加群成员($vi二维码编号,$用户id){
        $do = new DoQrcode();
        $pdo = pdo();
        $二维码信息 = $pdo -> selectBO($do,array('code'=>$vi二维码编号));

        $群成员详情 = $this->fc查看用户信息by_用户id群id($用户id,$二维码信息->data['note']);
        if(count($群成员详情)){
            if($群成员详情['角色'] =='未审核') return $this->vo信息中心->fh生成文本消息('您的申请已提交!');
            else  return  $this->ff发送进入群的通知($群成员详情,'您已是该群成员,点击进入',$群成员详情['群名称'],$二维码信息->data['note']);
        }

        $加群 =  $this->fj加入群($二维码信息->data['note'],$用户id,$二维码信息->data['user_id']);
        Cx消息路由::ff处理返回堆栈();
        return $加群;

    }

    private function fj检查用户是否加入该群($群id,$用户id){
        $res =  pdo()->selectColumns('群成员',array('角色'),array('群id'=>$群id,'用户id'=>$用户id));
        return $res['角色'];
    }

    public function fj加入群($群id,$用户id,$推荐人id=null){
        $用户信息 = $this->fc查看用户信息by_ID($用户id);

        $群详情 = pdo()->selectOne("SELECT a.*,b.openID  AS `群主openID`, b.`公众号ID` AS `群主公众号ID` ,c.openID  AS `助手openID`, c.`公众号ID` AS `助手公众号ID`
 FROM `群详情` a LEFT JOIN `用户` b ON(a.`群主id`=b.id)
  LEFT JOIN `用户` c ON(a.`助手id`=c.id) WHERE a.id=".$群id);


        $do = new Do群成员();
        $do->set_群id($群id);
        $do->set_用户id($用户id);
        $do->set_推荐人id($推荐人id);

        if($用户信息['认证'] =='1' && $群详情['未认证医生需要审核'] =='是') $do->set_角色('未审核');
        else  $do->set_角色('已审核');

        $插入 =  $do->insert();
        if(!$插入)return false;

        if($用户信息['认证'] ==1 && $群详情['未认证医生需要审核'] =='是') {

            $申请信息 = $用户信息['name'] . "申请进入" . $群详情['群名称'];
            $this->vo信息中心->ff发送文本消息_多公众号($申请信息, $群详情['群主openID'], $群详情['群主公众号ID']);
            if ($群详情['助手openID']) $this->vo信息中心->ff发送文本消息_多公众号($申请信息, $群详情['助手openID'], $群详情['助手公众号ID']);
            $this->vo信息中心->ff发送文本消息_多公众号('您的进群申请已提交', $this->vo用户数据->get_openID(), $this->vo用户数据->get_公众号ID());
            return true;
        }
        $do离线 = new Do群离线();
        $do离线->set_用户id($用户id);
        $do离线->set_群id($群id);
        if (!$do离线->where($do->data)->row()) {
            $do离线->set_insert_time(date("Y-m-d H:i:s"));
        }

        $do离线->set_用户ip(Tools::getIP());
        $do离线->set_last_insert_time(date("Y-m-d H:i:s"));
        $do离线->save();

        $this->ff发送进入群的通知($用户信息,'您已成功进入该群,点击进入',$群详情['群名称'],$群id);

        return true;

    }

    public function fj加入视频群聊($用户id,$群id,$推荐人id=null){
        if (!$用户id or !$群id) return false;
        $do = new Do群成员();
        $do->set_群id($群id);
        $do->set_用户id($用户id);
        $do->where($do->data)->row();
        $do->set_推荐人id($推荐人id);
        $do->set_角色('已审核');
        $插入 =  $do->save();
        if(!$插入) return false;

        return true;

    }

    public function f进入课程($用户id,$群id) {
        $do = new Do群离线();
        $do->set_用户id($用户id);
        $do->set_群id($群id);
        if (!$do->where($do->data)->row()) {
            $do->set_insert_time(date("Y-m-d H:i:s"));
        }
        $do->set_用户ip(Tools::getIP());
        $do->set_last_insert_time(date("Y-m-d H:i:s"));
        $do->set_is_online('1');
        $do->save();
    }

    public function f离开课程($用户id,$群id) {
        $do = new Do群离线();
        $do->set_用户id($用户id);
        $do->set_群id($群id);
        if (!$do->where($do->data)->row()) {
           return false;
        }
        $time_length = time() - strtotime($do->get_last_insert_time()); #本次在线时长
        $do->set_最后在线时间(date("Y-m-d H:i:s"));
        $do->set_time_length($time_length + $do->get_time_length());
        $do->save();
    }

    public function fj建群($用户id){
        $用户name = $_SESSION['vo用户数据']['name'];
        $群详情 = new Do群详情();
        $群名称 = ($_POST['群名称']) ? $_POST['群名称'] : $用户name;
        $群详情->set_群名称($群名称);
        $群详情->set_群主id($用户id);
        $医生审核 = ($_POST['审核']) ? '否' : '是';
        $成员拉人 = ($_POST['成员可拉人']) ? '否' : '是';
        $群详情->set_成员可拉人($成员拉人);
        $群详情->set_未认证医生需要审核($医生审核);
        $res = $群详情->insert();
        $群id = pdo()->lastInsertId();

        $do = new Do群成员();
        $do->set_用户id($用户id);
        $do->set_群id($群id);
        $do->set_角色('群主');
        $插入 =  $do->insert();

        if(!$插入)return false;

        $do离线 = new Do群离线();
        $do离线->set_用户id($用户id);
        $do离线->set_群id($群id);
        $do离线->set_最后在线时间(date('y-m-d H:i:s'));
        $do离线->insert();
        return $群id;

    }

    public function fj建课程群($用户id,$父id =0){
        $群详情 = new Do群详情();
        $群名称 = $_POST['title'];
        $群详情->set_群名称($群名称);
        $群详情->set_群主id($用户id);
        $医生审核 = '否';
        $成员拉人 = '是';
        $群详情->set_成员可拉人($成员拉人);
        $群详情->set_未认证医生需要审核($医生审核);
        $群详情->set_父id($父id);
        $res = $群详情->insert();
        $群id = pdo()->lastInsertId();

        $do = new Do群成员();
        $do->set_用户id($用户id);
        $do->set_群id($群id);
        $do->set_角色('群主');
        $插入 =  $do->insert();

        if(!$插入)return false;

        return $群id;

    }
    public  function f删除会议群($群id,$父id =0){
        $会议视频 = new Do会议视频();

        $群详情 = new Do群详情();

        $do离线 = new Do群离线();
        $do = new Do群成员();
    }
    public function fx显示群列表($用户id,$父id =null){
        $父级 = " AND b.`父id` <1 ";
        if($父id) $父级 = " AND b.`父id` = '".$父id."' ";

        $sql="SELECT b.`群名称`,b.id,( SELECT COUNT(d.id) FROM `群聊` d WHERE d.`时间`>(SELECT c.`最后在线时间` FROM `群离线` c WHERE  c.`用户id` = a.`用户id` AND c.`群id`=a.`群id` )  AND   d.`群id`=a.`群id`) AS `未读条数`,(SELECT COUNT(e.id) FROM `群成员` e WHERE e.`群id`=a.`群id` AND e.`角色` !='未审核') AS `成员数` FROM `群成员` a  LEFT JOIN `群详情` b on(a.`群id`= b.id) WHERE a.`用户id`=".$用户id." AND a.`角色` !='未审核' ".$父级." ;";

        $群列表 = pdo()->selectAll($sql);
     return  $群列表;
    }
    public function fx显示群列表1($用户id,$类型){

        $sql="SELECT b.`群名称`,b.id,( SELECT COUNT(d.id) FROM `群聊` d WHERE d.`时间`>(SELECT c.`最后在线时间` FROM `群离线` c WHERE  c.`用户id` = a.`用户id` AND c.`群id`=a.`群id` )  AND   d.`群id`=a.`群id`) AS `未读条数`,(SELECT COUNT(e.id) FROM `群成员` e WHERE e.`群id`=a.`群id` AND e.`角色` !='未审核') AS `成员数` FROM `群成员` a  LEFT JOIN `群详情` b on(a.`群id`= b.id) WHERE a.`用户id`=".$用户id." AND a.`角色` !='未审核' and b.`类型`='".$类型."' ";
        Logger::getInstance()->logDebug2("fx显示群列表1");
        Logger::getInstance()->logDebug2($sql);

        $群列表 = pdo()->selectAll($sql);
        //return $sql;
       return  $群列表;
    }

    public function fx显示群成员($群id,$角色){
        $sql = "SELECT a.*,b.`name`,b.`认证`,b.`头像`,c.`医院`,c.`职务` FROM `群成员` a LEFT JOIN `用户` b ON(a.`用户id` =b.id)  LEFT JOIN `医师详情` c ON(b.id = c.`用户id`)  WHERE a.`群id`='".$群id."' and a.`角色`".$角色.";";

        $群成员 = pdo()->selectAll($sql);


        return  $群成员;
    }

    public function fs审核删除群成员($成员id,$管理name){

        $成员详情 = $this->fc查看用户信息by_成员ID($成员id);
        $re = pdo()->delete('群成员',array('id'=>$成员id));
        $通知 = $管理name.'拒绝您进入'.$成员详情['群名称'].'群!';

        $this->fs删除群成员离线($成员详情['用户id'],$成员详情['群id']);

        $this->vo信息中心->ff发送文本消息_多公众号($通知,$成员详情['openID'],$成员详情['公众号ID']);
        return  $re;
    }

    public function  fs删除群成员离线($用户id,$群id){
        return  pdo()->delete('群离线',array('用户id'=>$用户id,'群id'=>$群id));
    }

    public function fs删除群成员($成员id,$管理name){

        $成员详情 = $this->fc查看用户信息by_成员ID($成员id);
        $re = pdo()->delete('群成员',array('id'=>$成员id));

        $this->fs删除群成员离线($成员详情['用户id'],$成员详情['群id']);

        if(!$re) return false;
        return $通知 = $管理name.'将'.$成员详情['name'].'移除该群!';

    }

    public function fs退出群($成员id,$用户name){

        $成员详情 = $this->fc查看用户信息by_成员ID($成员id);

        $this->fs删除群成员离线($成员详情['用户id'],$成员详情['群id']);

        if($成员详情['角色']=='助手') pdo()->update('群详情',array('助手id'=>''),array('id'=>$成员详情['群id']));
        $re = pdo()->delete('群成员',array('id'=>$成员id));
        if(!$re) return false;

        return $通知 = $用户name.'退出该群!';

    }

    public function fs审核群成员($成员id,$管理name){

        $成员详情 = $this->fc查看用户信息by_成员ID($成员id);

        $re = pdo()->update('群成员',array('角色'=>'已审核'),array('id'=>$成员id));

        $do离线 = new Do群离线();
        $do离线->set_用户id($成员详情['用户id']);
        $do离线->set_群id($成员详情['群id']);
        $do离线->set_最后在线时间(date('y-m-d H:i:s'));
        $do离线->insert();

        $通知 = $管理name.'已同意您进入'.$成员详情['群名称'].'群!';
        if(!$re) return false;
        $this->ff发送进入群的通知($成员详情,'您已成功进入该群,点击进入',$成员详情['群名称'],$成员详情['群id']);

          return  $通知2= $管理name.'已同意'.$成员详情['name'].'进入该群!';

    }

    public function fs设置成为群助($成员id){

        $成员详情 = $this->fc查看用户信息by_成员ID($成员id);

        $sql = "UPDATE `群成员` a, 群详情 b SET a.`角色`='助手',b.`助手id`=a.`用户id`  WHERE a.id=".$成员id." AND b.id=a.`群id`;";
        $re = pdo()->selects($sql);


        $通知 = '您已成为'.$成员详情['群名称'].'群管理员!';
        $this->vo信息中心->ff发送文本消息_多公众号($通知,$成员详情['openID'],$成员详情['公众号ID']);

        return  true;
    }

    public function fs取消群助手($成员id){

        $成员详情 = $this->fc查看用户信息by_成员ID($成员id);

        $sql = "UPDATE `群成员` a, 群详情 b SET a.`角色`='已审核',b.`助手id`=''  WHERE a.id=".$成员id." AND b.id=a.`群id`;";
        $re = pdo()->selects($sql);


        return  true;
    }

    public function fc查看用户是否是群用户($用户id,$群id){
        $用户是群用户=pdo()->selectOne("SELECT a.*,(SELECT b.`最后在线时间` FROM `群离线` b WHERE a.`用户id`=b.`用户id` AND a.`群id`=b.`群id`) AS `离线时间` FROM `群成员` a  WHERE a.`群id` =".$群id." and a.`用户id`=".$用户id." and a.`角色` !='未审核' ");
        return $用户是群用户;
    }

    public function fc查找群信息($群id){
        $查找群信息= pdo()->selectColumns('群详情',array('*'),array('id'=>$群id));

        return $查找群信息;
    }

    //重构发送进群通知--修改图文路径--2016-8-26
    public function ff发送进入群的通知($用户,$title,$group_name,$groupId){

        $vo新闻=new Cbo图文消息列表();
        $url = Tools::url('group','chat',array('groupId'=>$groupId,'tuisong'=>'yes'));
        $pictureUrl =  G_SITE_BASE.'/business/' . 'img/logoRed2.png';
        $vo新闻->ft添加图文消息 ('💻'.$title.'', '', $url, ''); // 添加一条图文信息
        $vo新闻->ft添加图文消息(''.$group_name.'', '', $url, $pictureUrl);

        $ret =  $vo新闻;
        $ret2=$this->vo信息中心->ff发送图文消息_多公众号($ret,$用户['openID'],$用户['公众号ID']);
        return true;
    }

    //ff发送进入群的通知 ---重构前走的路径
    public function ff发送进入群的通知1($用户,$标题,$群name,$群id){
      //  $voCenter=C信息中心::get实列根据用户Oid($用户['openID']);
        $parms=['type'=>$标题,'用户id'=>$用户['id'],'openID'=>$用户['openID']];

        $ret=$this->vo信息中心->vc微直达->给用户发送聊天信息($parms,$标题,$群name,$群id,'websocket_qun');
        $ret2=$this->vo信息中心->ff发送图文消息_多公众号($ret,$用户['openID'],$用户['公众号ID']);
        return true;
    }

    public function ff发送进入会议的通知($vi二维码编号,$用户id){
        $do = new DoQrcode();
        $pdo = pdo();
        $二维码信息 = $pdo -> selectBO($do,array('code'=>$vi二维码编号));
        //$群成员详情 = $this->fc查看用户信息by_用户id群id($用户id,$二维码信息->data['note']);
        $群信息 = pdo()->selectOne("select 群名称 from 群详情 where id=".$二维码信息->data['note']);
        $用户 = pdo()->selectOne("select openID,公众号ID from 用户 where id =".$用户id);
        $标题 = '点击进入报名';
        $parms=['type'=>$标题,'用户id'=>$用户id,'openID'=>$用户['openID']];
        $res = $this->vo信息中心->vc微直达->给用户发送会议信息($parms,$标题,$群信息['群名称']."大会报名入口",'AddMeet_users_beida');
        $ret2=$this->vo信息中心->ff发送图文消息_多公众号($res,$用户['openID'],$用户['公众号ID']);
        Cx消息路由::ff处理返回堆栈();
        return true;
    }

    function f写入聊天记录($groupId, $userId, $type, $message) {
        $types = array('语音', '图片', '文本');
        if (!in_array($type, $types)) {
            return false;
        }

        if (!$groupId or !$userId or !$message) {
            return false;
        }

        $do = new Do群聊();
        $do->set_用户id($userId);
        $do->set_群id($groupId);

        if ($type == '文本') {
            $do->set_聊天内容($message);
        }

        if ($type == '语音' or $type ==  '图片') {
            $do->set_地址($message);
        }
        $do->set_聊天类型($type);
        return $do->save();
    }


}